package InnerClass.InnerClassDemo001;

/**
 * ClassName:Inner001
 * Package:InnerClass.InnerClassDemo001
 * Description:
 *
 * @Author:ZhangXin
 * @Create2023/1/26-0:12
 * @Version:v1.0
 */
public class Inner001 {
    /*
    * 类的五大成员
    * 属性,方法,构造方法,代码块,内部类
    *
    * 内部类
    * 在一个类的里面,在定义一个类
    *
    * 内部类表示的事物是外部类的一部分
    * 内部类单独出现没有任何意义
    *
    * 内部类的访问特点
    * 1.内部类可以直接访问外部类的成员,包括私有
    * 2.外部类要访问内部类的成员,必须创建对象
    *
    * 内部类的分类(成员内部类,静态内部类,局部内部类,匿名内部类)
    * 1.成员内部类(写在成员位置的,属于外部类的成员)
    *   a.成员内部类可以被private,public,protected,static进行修饰
    *   b.获取成员内部类对象的两种方式
    *       1.1：外部类编写方法,对外提供内部类对象
    *       1.2：直接创建
    *           格式：外部类名.内部类名 对象名 = 外部类对象.内部类对象
    *           范例：Outer.Inner oi = new Outer().new Inner();
    *   c.外部类成员变量和内部类成员变量重名时,在内部类如何访问
    *       sout(Outer.this.变量名);
    *
    * 2.静态内部类(特殊的成员内部类)
    *   a.静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象
    *   b.创建静态内部类对象的格式：外部类名.内部类名 对象名 = new 外部类名.内部类名();
    *   c.调用非静态方法的格式：先创建对象,用对象调用
    *   d.调用静态方法的格式：外部类名.内部类名.方法名();
    *
    * 3.局部内部类
    *   a.将内部类定义在方法里面叫做局部内部类,类似于方法里面的局部变量
    *   b.外界是无法直接使用局部内部类,需要在方法内部创建对象并使用
    *   c.该类可以直接访问外部类的成员,也可以访问方法内的局部变量
    *
    * 4.匿名内部类(本质上就是隐藏了名字的内部类)
    *   格式：new 类名或者接口名(){
    *               重写方法
    *        };----》[继承/实现,方法重写,创建对象]
    *   类--->继承extends/接口--->实现关系implements
    *
    * 使用场景
    *   当方法的参数是接口或者类时,以接口为例,可以传递这个接口的实现对象,
    *   如果实现类只要使用一次,就可以用匿名内部类简化代码*/
}
